//! 资源管理器接口
//!
//! 定义资源管理器的通用接口

use super::{ResourceContext, ResourceResult};
use async_trait::async_trait;
use std::sync::Arc;

/// 资源管理器 trait
///
/// 定义资源加载和管理的通用接口
///
/// # 类型参数
///
/// - `T`: 资源类型（如数据库连接、规则引擎等）
///
/// # 示例
///
/// ```ignore
/// use common::resource::{ResourceManager, ResourceContext};
/// use async_trait::async_trait;
///
/// struct MyResourceManager {
///     // ...
/// }
///
/// #[async_trait]
/// impl ResourceManager<MyResource> for MyResourceManager {
///     async fn load_resource(&self, context: &ResourceContext, code: &str) -> ResourceResult<Arc<MyResource>> {
///         // 实现资源加载逻辑
///         todo!()
///     }
///     
///     async fn initialize(&self) -> ResourceResult<()> {
///         // 实现初始化逻辑
///         Ok(())
///     }
/// }
/// ```
#[async_trait]
pub trait ResourceManager<T>: Send + Sync {
    /// 加载资源
    ///
    /// 根据上下文和代码加载对应的资源
    ///
    /// # 参数
    ///
    /// - `context`: 资源上下文（包含维度信息）
    /// - `code`: 资源代码（如地区代码）
    ///
    /// # 返回
    ///
    /// 返回加载的资源（Arc 包装，支持共享）
    async fn load_resource(
        &self,
        context: &ResourceContext,
        code: &str,
    ) -> ResourceResult<Arc<T>>;

    /// 初始化资源管理器
    ///
    /// 执行必要的初始化操作，如扫描资源目录、加载注册表等
    async fn initialize(&self) -> ResourceResult<()>;

    /// 预加载资源
    ///
    /// 提前加载资源到缓存中
    async fn preload(
        &self,
        context: &ResourceContext,
    ) -> ResourceResult<()> {
        // 默认实现：加载当前层级的资源
        let code = context.current_code();
        let _ = self.load_resource(context, code).await?;
        Ok(())
    }

    /// 刷新资源
    ///
    /// 重新扫描和加载资源
    async fn refresh(&self) -> ResourceResult<()> {
        // 默认实现：重新初始化
        self.initialize().await
    }
}
